home *** CD-ROM | disk | FTP | other *** search
/ c't freeware shareware 1999 February / CT_SW9902.ISO / mac / software / wissen / daten / gnuplot.hqx / gnuplot.2.0b4 / Interapplication / C Examples / gnuplotInterface.c < prev    next >
Text File  |  1997-04-27  |  12KB  |  350 lines

  1. /* Version 2.0, DCS, 14/97 */
  2.  
  3. #include <AppleEvents.h>
  4. #include <AERegistry.h>
  5. #include <AEObjects.h>
  6. #include <AEPackObject.h>
  7. #include <Types.h>
  8. #include <Files.h>
  9. #include <Processes.h>
  10. #include <string.h>
  11.  
  12. #include "gnuplotInterface.h"
  13.  
  14. static Boolean SearchForFile(OSType theCreatorType, OSType theFileType, FSSpec *theFile, short count);
  15.  
  16. static void ExtractReply(AEDesc *reply, char *result, long resultLen);
  17. const OSType gnuplotID = 'GPSE';
  18.  
  19.  
  20. /* Public functions the client application can use */
  21.  
  22. OSErr GnuplotLaunchApplication()
  23. {
  24.     return (GnuplotLaunchApplicationCore(launchDontSwitch));
  25. }
  26.  
  27. OSErr GnuplotLaunchApplicationToFront()
  28. {
  29.     return (GnuplotLaunchApplicationCore(0));
  30. }
  31.  
  32.  
  33. OSErr GnuplotLaunchApplicationCore(long flags)
  34. {
  35. /* This routine is taken in part from Nick Triantos' "SafeLauncher" program */
  36.     LaunchParamBlockRec        myLaunchParams ;
  37.     ProcessSerialNumber        launchedProcessSN;
  38.     ProcessInfoRec            processInfo;
  39.     OSErr                    launchErr ;
  40.     FSSpec                    sfFile;
  41.     Str255                    name;
  42.     Boolean                    gnuplotRunning = false;
  43.     
  44.     /* See if gnuplot is already running */
  45.     
  46.     processInfo.processInfoLength = sizeof(processInfo);
  47.     processInfo.processName = (StringPtr) name;
  48.     processInfo.processAppSpec = &sfFile;
  49.     launchedProcessSN.highLongOfPSN = 0;
  50.     launchedProcessSN.lowLongOfPSN = kNoProcess;
  51.     while (GetNextProcess(&launchedProcessSN) == noErr) {
  52.         if (GetProcessInformation(&launchedProcessSN, &processInfo) == noErr) {
  53.             if (processInfo.processType == 'APPL' && processInfo.processSignature == 'GPSE') {
  54.                 gnuplotRunning = true;
  55.                 if (flags == 0)
  56.                     SetFrontProcess(&(processInfo.processNumber));
  57.                 return 0;
  58.             }
  59.         }
  60.     }
  61.     if (gnuplotRunning == false)
  62.         if (!SearchForFile('GPSE', 'APPL', &sfFile, 1))
  63.             return(-43);
  64.     myLaunchParams.launchAppSpec = &sfFile ;
  65.     myLaunchParams.launchBlockID = extendedBlock ;
  66.     myLaunchParams.launchEPBLength = extendedBlockLen ;
  67.     myLaunchParams.launchFileFlags = 0 ;
  68.     myLaunchParams.launchControlFlags = launchContinue + launchNoFileFlags +flags;
  69.     myLaunchParams.launchAppParameters = nil ;
  70.  
  71.     launchErr = LaunchApplication(&myLaunchParams) ;
  72.     return(launchErr);
  73. }
  74.  
  75. OSErr GnuplotExecuteCommand(char *theCommand, long length, char *response, long responseLength)
  76. {
  77.     AppleEvent        theEventToSend = {typeNull, NULL};
  78.     AEDesc            theReply = {typeNull, NULL};
  79.     AEAddressDesc    gnuplotAppDesc = {typeNull, NULL};
  80.     OSErr            err = 0;
  81.     
  82.     /* Create the gnuplot descriptor */
  83.     err = AECreateDesc(typeApplSignature, &gnuplotID, sizeof(gnuplotID), &gnuplotAppDesc);
  84.     /* Create the Apple Event */
  85.     if (err == noErr)
  86.         err = AECreateAppleEvent('GPSE', 'exec', &gnuplotAppDesc, -1, kAnyTransactionID, &theEventToSend);
  87.     if (err == noErr)
  88.         err = AEPutParamPtr(&theEventToSend, keyDirectObject, typeChar, theCommand, length);
  89.     if (err == noErr)
  90.     /* Send the Apple Event */
  91.     if (err == noErr)
  92.         err = AESend(&theEventToSend, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
  93.     ExtractReply(&theReply, response, responseLength);
  94.     /* Clean up after ourselves */    
  95.     AEDisposeDesc(&gnuplotAppDesc);
  96.     AEDisposeDesc(&theEventToSend);
  97.     AEDisposeDesc(&theReply);
  98.     return err;
  99. }
  100.  
  101. OSErr GnuplotDoScript(FSSpec *inputFile, char *response, long responseLength)
  102. {
  103.     AppleEvent        theEventToSend = {typeNull, NULL};
  104.     AEDesc            theReply = {typeNull, NULL};
  105.     AEAddressDesc    gnuplotAppDesc = {typeNull, NULL};
  106.     OSErr            err;
  107.         
  108.     /* Create the gnuplot descriptor */
  109.     err = AECreateDesc(typeApplSignature, &gnuplotID, sizeof(gnuplotID), &gnuplotAppDesc);
  110.     if (err == noErr)
  111.         /* Create the Apple Event */
  112.     if (err == noErr)
  113.         err = AECreateAppleEvent(kAEMiscStandards, 'dosc', &gnuplotAppDesc, -1, kAnyTransactionID, &theEventToSend);
  114.     if (err == noErr)
  115.         err = AEPutParamPtr(&theEventToSend, keyDirectObject, typeFSS, inputFile, sizeof(FSSpec));
  116.     if (err == noErr)
  117.         /* Send the Apple Event */
  118.         err = AESend(&theEventToSend, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
  119.     ExtractReply(&theReply, response, responseLength);
  120.     /* Clean up after ourselves */    
  121.     AEDisposeDesc(&gnuplotAppDesc);
  122.     AEDisposeDesc(&theEventToSend);
  123.     AEDisposeDesc(&theReply);
  124.     return err;
  125. }
  126.  
  127. OSErr GnuplotPlot(FSSpec *inputFile, long fileCount, char *data, long dataSize, 
  128.         short useClipboard, short do3d, long lineType, char *response, long responseLength)
  129. {
  130.     AppleEvent        theEventToSend = {typeNull, NULL};
  131.     AEDesc            appDesc = {typeNull, NULL}, theReply = {typeNull, NULL};
  132.     AEDesc            theObject = {typeNull, NULL}, clipDesc = {typeNull, NULL};
  133.     AEAddressDesc    gnuplotAppDesc = {typeNull, NULL};
  134.     AEDescList        plotData = {typeNull, NULL};
  135.     OSErr            err, i;
  136.     long            plotType = 'plot';
  137.     DescType         clipboardType = 'clip';    
  138.         
  139.     GnuplotInitializeObjects();
  140.     /* Create the gnuplot descriptor */
  141.     err = AECreateDesc(typeApplSignature, &gnuplotID, sizeof(gnuplotID), &gnuplotAppDesc);
  142.     if (do3d)
  143.         plotType = 'splt';
  144.     /* Create the Apple Event */
  145.     if (err == noErr)
  146.         err = AECreateAppleEvent('GPLT', plotType, &gnuplotAppDesc, -1, kAnyTransactionID, &theEventToSend);
  147.     if (err == noErr)
  148.         err = AECreateList(NULL, 0, 0, &plotData);
  149.     if (inputFile && (err == noErr)) {
  150.         for (i = 0; i < fileCount && err == noErr; i++) {
  151.             err = AEPutPtr(&plotData, 0, typeFSS, &inputFile[i], sizeof(FSSpec));
  152.         }
  153.     }
  154.     if (dataSize && data != NULL && (err == noErr)) {
  155.             err = AEPutPtr(&plotData, 0, typeChar, data, dataSize);
  156.     }
  157.     if (useClipboard && (err == noErr)) {
  158.         /* Now create the object specifer */
  159.           /* Create a descriptor for the application */
  160.         AECreateDesc(typeNull, NULL, 0, &appDesc);
  161.         err = AECreateDesc(typeType, &clipboardType, sizeof(DescType), &clipDesc);
  162.         err = CreateObjSpecifier(cProperty, &appDesc, formPropertyID, &clipDesc, 0, &theObject);
  163.         err = AEPutDesc(&plotData, 0, &theObject);
  164.     }
  165.     if (err == noErr)
  166.         err = AEPutParamDesc(&theEventToSend, keyDirectObject, &plotData);
  167.     if (lineType != gp_type_default && err == noErr) {
  168.         err = AEPutParamPtr(&theEventToSend, 'line', typeEnumerated, &lineType, sizeof(lineType));
  169.     }
  170.     if (err == noErr)
  171.         /* Send the Apple Event */
  172.         err = AESend(&theEventToSend, &theReply, kAEWaitReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
  173.     ExtractReply(&theReply, response, responseLength);
  174.     /* Clean up after ourselves */    
  175.     AEDisposeDesc(&theObject);
  176.     AEDisposeDesc(&clipDesc);
  177.     AEDisposeDesc(&appDesc);
  178.     AEDisposeDesc(&plotData);
  179.  
  180.     AEDisposeDesc(&theEventToSend);
  181.     AEDisposeDesc(&gnuplotAppDesc);
  182.     AEDisposeDesc(&theReply);
  183.     return err;
  184. }
  185.  
  186.  
  187. void GnuplotQuitApplication()
  188. {
  189.     AppleEvent        theEventToSend = {typeNull, NULL};
  190.     AEDesc            theReply = {typeNull, NULL};
  191.     AEAddressDesc    gnuplotAppDesc = {typeNull, NULL};
  192.     OSErr            err;
  193.     
  194.     /* Create the gnuplot descriptor */
  195.     err = AECreateDesc(typeApplSignature, &gnuplotID, sizeof(gnuplotID), &gnuplotAppDesc);
  196.     /* Create the Apple Event */
  197.     if (err == noErr)
  198.         err = AECreateAppleEvent(typeAppleEvent, kAEQuitApplication, &gnuplotAppDesc, -1, kAnyTransactionID, &theEventToSend);
  199.         /* Send the Apple Event */
  200.     if (err == noErr)
  201.         err = AESend(&theEventToSend, &theReply, kAENoReply, kAENormalPriority, kNoTimeOut, NULL, NULL);
  202.     /* Clean up after ourselves */    
  203.     AEDisposeDesc(&gnuplotAppDesc);
  204.     AEDisposeDesc(&theEventToSend);
  205.     AEDisposeDesc(&theReply);
  206. }
  207.  
  208. /* Call GnuplotInitializeObjects before doing anything that tries to get data from gnuplot */
  209. /* Call GnuplotShutDownObjects to reclaim any memory from the object stuff */
  210.  
  211. typedef enum { notInitialized, initializedOnce, initializedNow } Init;
  212.  
  213. static AEDesc    basePictureObjDesc = {typeNull, NULL};
  214. static    Init    initialized = notInitialized;
  215.  
  216. OSErr    GnuplotInitializeObjects()
  217. {
  218.     OSErr    err = 0;
  219.     
  220.     
  221.     if (initialized == notInitialized)
  222.         err = AEObjectInit();
  223.     initialized = initializedOnce;
  224.     return err;
  225. }
  226.  
  227. /* Call GnuplotShutDownObjects to reclaim any memory */
  228.  
  229. void GnuplotShutDownObjects()
  230. {
  231. }
  232.  
  233.  
  234.  
  235.  
  236. OSErr GnuplotSetWorkingFolder(char *newFolder)
  237. {
  238.     AEDesc    appDesc, pathDesc, theObject, theReply, gnuplotAppDesc;
  239.     AEDesc    pathTypeDesc;
  240.     AppleEvent    theEventToSend;
  241.     DescType folderType = 'wfdr';    
  242.     int    length;
  243.     OSErr    err;
  244.     
  245.     if (initialized != initializedNow)
  246.         GnuplotInitializeObjects();
  247.     length = strlen(newFolder);
  248.     /* Create a descriptor for the application */
  249.     AECreateDesc(typeNull, NULL, 0, &appDesc);
  250.     /* Create a descriptor for the new path */
  251.     AECreateDesc(typeChar, newFolder, length, &pathDesc);
  252.     /* Now create the object specifer */
  253.     err = AECreateDesc(typeType, &folderType, sizeof(DescType), &pathTypeDesc);
  254.     CreateObjSpecifier(cProperty, &appDesc, formPropertyID, &pathTypeDesc, 0, &theObject);
  255.     /* Create the gnuplot descriptor */
  256.     err = AECreateDesc(typeApplSignature, &gnuplotID, sizeof(gnuplotID), &gnuplotAppDesc);
  257.     /* Create the Apple Event */
  258.     err = AECreateAppleEvent(kAECoreSuite, kAESetData, &gnuplotAppDesc, -1, kAnyTransactionID, &theEventToSend);
  259.     err = AEPutParamDesc(&theEventToSend, keyDirectObject, &theObject);
  260.     err = AEPutParamDesc(&theEventToSend, keyAEData, &pathDesc);
  261.     err = AESend(&theEventToSend, &theReply, kAENoReply + kAENeverInteract, kAENormalPriority,
  262.             kAEDefaultTimeout, NULL, NULL);
  263.     err = AEDisposeDesc(&theEventToSend);
  264.     err = AEDisposeDesc(&gnuplotAppDesc);
  265.     err = AEDisposeDesc(&theObject);
  266.     err = AEDisposeDesc(&pathTypeDesc);
  267.     err = AEDisposeDesc(&pathDesc);
  268.     err = AEDisposeDesc(&appDesc);
  269.     return(err);
  270. }
  271.  
  272.  
  273. /* Private functions and data the client app shouldn't use */
  274.  
  275. void ExtractReply(AEDesc *reply, char *result, long resultLen)
  276. {
  277.     OSErr err;
  278.     DescType iWant = typeChar;
  279.     DescType iGot;
  280.     long length;
  281.     
  282.     if (result == NULL || resultLen == 0)
  283.         return;
  284.     
  285.     err = AEGetParamPtr(reply, keyDirectObject, iWant, &iGot, result, resultLen-1, &length);
  286.     if (err != noErr)
  287.         result[0] = 0;
  288.     else
  289.         result[length] = 0;
  290. }
  291.  
  292. static Boolean SearchForFile(OSType theCreatorType, OSType theFileType, FSSpec *theFile, short count)
  293. {
  294.     HParamBlockRec    myHPBRec;
  295.     OSErr            myError;
  296.     CInfoPBRec        spec1, spec2;
  297.     char            *buffer;
  298.     long            bufferSize = 16384;
  299.     FSSpec            theApp;
  300.     ProcessInfoRec    appInformation;
  301.     ProcessSerialNumber serialNumber;
  302.     
  303.     serialNumber.lowLongOfPSN = kCurrentProcess;
  304.     serialNumber.highLongOfPSN = 0;
  305.     
  306.     appInformation.processInfoLength = sizeof(ProcessInfoRec);
  307.     appInformation.processName = NULL;
  308.     appInformation.processAppSpec = &theApp;
  309.     GetProcessInformation(&serialNumber, &appInformation);
  310.     buffer = NewPtr(bufferSize);
  311.     if (buffer == NULL)
  312.         return(false);
  313.     myHPBRec.csParam.ioCompletion = NULL;
  314.     myHPBRec.csParam.ioNamePtr = NULL;
  315.     myHPBRec.csParam.ioVRefNum = theApp.vRefNum;
  316.     myHPBRec.csParam.ioMatchPtr = theFile;
  317.     myHPBRec.csParam.ioReqMatchCount = count;
  318.     myHPBRec.csParam.ioSearchBits = fsSBFlFndrInfo;
  319.     myHPBRec.csParam.ioSearchInfo1 = &spec1;
  320.     myHPBRec.csParam.ioSearchInfo2 = &spec2;
  321.     myHPBRec.csParam.ioSearchTime = 0;
  322.     myHPBRec.csParam.ioCatPosition.initialize = 0;
  323.     myHPBRec.csParam.ioOptBuffer = buffer;
  324.     myHPBRec.csParam.ioOptBufSize = bufferSize;
  325.     spec1.hFileInfo.ioNamePtr = NULL;
  326.     spec1.hFileInfo.ioFlFndrInfo.fdType = theFileType;
  327.     spec1.hFileInfo.ioFlFndrInfo.fdCreator = theCreatorType;
  328.     spec1.hFileInfo.ioFlAttrib = 0;
  329.     spec1.hFileInfo.ioFlParID = 0;
  330.     spec2 = spec1;
  331.     spec2.hFileInfo.ioFlAttrib = 0x10;
  332.     spec2.hFileInfo.ioFlFndrInfo.fdCreator = theCreatorType;
  333.     spec2.hFileInfo.ioFlFndrInfo.fdType = -1;
  334.     spec2.hFileInfo.ioFlFndrInfo.fdFlags = 0;                        
  335.     spec2.hFileInfo.ioFlFndrInfo.fdLocation.h = spec2.hFileInfo.ioFlFndrInfo.fdLocation.v = 0;        
  336.     spec2.hFileInfo.ioFlFndrInfo.fdFldr = 0;
  337.     spec2.hFileInfo.ioFlParID = 0;
  338.     myError = PBCatSearchSync((CSParamPtr)&myHPBRec);
  339.     DisposePtr(buffer);
  340.     if (myHPBRec.csParam.ioReqMatchCount == myHPBRec.csParam.ioActMatchCount)
  341.         myError = eofErr;
  342.     if (myHPBRec.csParam.ioActMatchCount == 0)
  343.         myError = 0;
  344.     if (myError == eofErr)
  345.         return(true);
  346.     else
  347.         return(false);
  348. }
  349.  
  350.